Parkinson's Disease (PD) Detection Using Hand-Drawn Images¶
1 Project¶
Motivation: In recent years, the prevalence of Parkinson's Disease (PD) has increased, highlighting the need for early and accurate detection. Hand-drawn patterns, are commonly used in clinical assessments to evaluate motor impairments associated with PD. By analyzing these images, we aim to leverage deep learning to develop an automated, non-invasive tool that complements clinical practices.
Problem: Parkinson's Disease, a progressive neurodegenerative disorder, significantly impacts motor skills, making early detection vital for managing symptoms and improving quality of life. Can human judgment reliably detect subtle patterns in hand-drawn images? Could deep learning models provide an accurate and efficient solution for this binary classification task, distinguishing images as PD or non-PD?
Approaches:
Deep Learning: Utilize CNN-based models, including MobileNetV2, VGG16, and DenseNet121, for feature extraction and image classification.
Traditional Models: Apply SVM, KNN, and Random Forest as baseline comparisons to evaluate the performance of deep learning models.
2 Data¶
Acquisition: The dataset, "Parkinson's Disease Augmented Data of Handdrawings", is sourced from Kaggle. The data originates from the original dataset created by K Scott Mader, which contained 204 images. Through augmentation processes, including rotations (90°, 180°, 270°), vertical flipping (180°), and conversion to color images, 204 original images was increased to 3264 images (Anil Kumar, 2023).
Description:
Folder:
DatasetSubfolders:
Healthy: 1,632 imagesParkinson: 1,632 images
Total Images: 3,264
Content: Hand-drawn spirals and waves.
Reference
Anil Kumar, B. (2023). Parkinson's Disease Augmented Data of Handdrawings [Dataset]. Kaggle. Retrieved from https://www.kaggle.com/datasets/banilkumar20phd7071/handwritten-parkinsons-disease-augmented-data/data.
Import Libraries¶
import os
import random
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
import seaborn as sns
import cv2
SEED = 42
random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)
os.environ['PYTHONHASHSEED'] = str(SEED)
Load Data¶
Read image file paths from dataset folders.
Assign corresponding labels:
0for "Healthy",1for "Parkinson".Store image paths and labels in arrays.
# Define dataset path
dataset_path = '/kaggle/input/handwritten-parkinsons-disease-augmented-data/Dataset/Dataset'
output_dir = '/kaggle/working/preprocessed_dataset'
# Define categories and assign labels
classes = {'Healthy': 0, 'Parkinson': 1}
# Collect all image file paths and corresponding labels
image_paths = []
labels = []
for cls, label in classes.items():
cls_path = os.path.join(dataset_path, cls)
for img_name in os.listdir(cls_path):
image_paths.append(os.path.join(cls_path, img_name))
labels.append(label)
# Convert to NumPy arrays
image_paths = np.array(image_paths)
labels = np.array(labels)
print(f"Total images loaded: {len(image_paths)}")
Total images loaded: 3264
from sklearn.model_selection import train_test_split
# Split dataset into training (80%) and testing (20%)
train_paths, test_paths, train_labels, test_labels = train_test_split(
image_paths, labels, test_size=0.20, random_state=SEED, stratify=labels
)
print(f"Total images: {len(image_paths)} (Training: {len(train_paths)}, Testing: {len(test_paths)})")
Total images: 3264 (Training: 2611, Testing: 653)
# Visualization of label distribution
fig, axes = plt.subplots(1, 2, figsize=(13, 3.5), gridspec_kw={'wspace': 0.3})
# Define class labels
pie_labels = ['Healthy', 'Parkinson']
# Count occurrences of each label in the entire dataset
unique_labels, counts_labels = np.unique(labels, return_counts=True)
# Define colors
new_colors = ['lightblue', 'lightcoral']
edge_color = 'black'
# Prepare text annotations for Healthy and Parkinson counts
healthy_count = counts_labels[0]
parkinson_count = counts_labels[1]
# Plot pie chart for the entire dataset
wedges, texts, autotexts = axes[0].pie(
counts_labels, labels=pie_labels, autopct='%1.1f%%', startangle=90,
colors=new_colors, wedgeprops={'edgecolor': edge_color, 'linewidth': 0.5}
)
axes[0].set_title('\nOverall Distribution\n')
axes[0].axis('equal')
# Annotate counts on pie chart
axes[0].text(-1.6, -1.15, f'Healthy: {healthy_count}', fontsize=8, color='black')
axes[0].text(-1.6, -1.3, f'Parkinson: {parkinson_count}', fontsize=8, color='black')
# Count occurrences in training and testing sets
train_healthy, train_parkinson = np.bincount(train_labels)
test_healthy, test_parkinson = np.bincount(test_labels)
# Plot bar chart for training and testing sets
bar_width = 0.3
x_positions = np.arange(len(['Training Set', 'Testing Set']))
bars_healthy = axes[1].bar(x_positions - bar_width / 2, [train_healthy, test_healthy], width=bar_width,
label='Healthy', color=new_colors[0], edgecolor=edge_color, linewidth=0.5)
bars_parkinson = axes[1].bar(x_positions + bar_width / 2, [train_parkinson, test_parkinson], width=bar_width,
label='Parkinson', color=new_colors[1], edgecolor=edge_color, linewidth=0.5)
# Annotate counts on bar chart
for bar in bars_healthy:
axes[1].text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 10, str(int(bar.get_height())), ha='center', fontsize=10)
for bar in bars_parkinson:
axes[1].text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 10, str(int(bar.get_height())), ha='center', fontsize=10)
axes[1].set_xlabel('Dataset')
axes[1].set_ylabel('Count')
axes[1].set_title('\nTraining vs Testing Distribution\n')
axes[1].set_xticks(x_positions)
axes[1].set_xticklabels(['Training Set', 'Testing Set'])
axes[1].grid(axis='y', linestyle='--', alpha=0.5)
axes[1].legend()
plt.tight_layout()
# plt.savefig('label_distribution.png', dpi=300)
plt.show()
The label distribution is perfectly balanced!
Step 2: Data Cleaning¶
Check for Missing Data: Ensure that the image file exists and is accessible to avoid processing missing or unavailable files.
Check Data Integrity: Detect and remove corrupted images that cannot be loaded to maintain data quality.
Check for Extreme Values: Convert images to grayscale and analyze brightness levels to identify blank or overexposed images.
# Function to clean the dataset
def clean_image_data(image_paths):
cleaned_paths = []
for img_path in image_paths:
# Check foe missing data
if not os.path.exists(img_path):
print(f"Missing file: {img_path}")
continue
image = cv2.imread(img_path)
# Check data integrity
if image is None:
print(f"Corrupted image: {img_path}")
continue
# Check for extreme values
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
if np.mean(gray_image) < 10 or np.mean(gray_image) > 245:
print(f"Potential noisy image: {img_path}")
continue
# Save cleaned image to a new directory
cleaned_paths.append(img_path)
return cleaned_paths
# Print the count before cleaning
print(f"Before cleaning - Total images: 3264")
# Apply the cleaning process to the dataset
train_paths = clean_image_data(train_paths)
test_paths = clean_image_data(test_paths)
# Print the final count after cleaning
print(f"After cleaning - Total images: {len(train_paths) + len(test_paths)}")
Before cleaning - Total images: 3264 After cleaning - Total images: 3264
The data cleaning process did not remove any images, showing that all images were valid and met the quality criteria perfectly!
Step 3: Data Preprocessing¶
1. Image Preprocessing and Visualizations:¶
Resize all images to a fixed size of
256x256pixels for consistency.Convert them into numerical arrays using
img_to_array.Save them in
train/andtest/directories with subfolders for each class (0for Healthy and1for Parkinson).
# Display some sample images
fig, axes = plt.subplots(2, 10, figsize=(15, 5))
# Get indices for each class
healthy_indices = np.where(labels == 0)[0][:10]
parkinson_indices = np.where(labels == 1)[0][:10]
for idx, img_idx in enumerate(healthy_indices):
img_path = image_paths[img_idx]
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
axes[0, idx].imshow(img)
axes[0, idx].set_title("Healthy")
axes[0, idx].axis('off')
for idx, img_idx in enumerate(parkinson_indices):
img_path = image_paths[img_idx]
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
axes[1, idx].imshow(img)
axes[1, idx].set_title("Parkinson")
axes[1, idx].axis('off')
plt.tight_layout()
# plt.savefig('images.png', dpi=300)
plt.show()
from tensorflow.keras.preprocessing.image import img_to_array
# Create output directories
if not os.path.exists(output_dir):
os.makedirs(output_dir)
os.makedirs(os.path.join(output_dir, 'train'))
os.makedirs(os.path.join(output_dir, 'test'))
# Resizing and Saving
def preprocess_and_save(image_paths, labels, split_name):
"""Resize images, convert to arrays, and save to new directories."""
target_size = (256, 256)
for img_path, label in zip(image_paths, labels):
image = cv2.imread(img_path)
if image is not None:
# Resize and convert image to array
resized_image = cv2.resize(image, target_size)
img_array = img_to_array(resized_image)
# Define save path based on label
class_dir = os.path.join(output_dir, split_name, str(label))
if not os.path.exists(class_dir):
os.makedirs(class_dir)
# Save processed image
img_name = os.path.basename(img_path)
save_path = os.path.join(class_dir, img_name)
cv2.imwrite(save_path, resized_image)
# Preprocess and save training and testing data
preprocess_and_save(train_paths, train_labels, 'train')
preprocess_and_save(test_paths, test_labels, 'test')
print("Data preprocessing completed. Resized images saved in train/test directories.")
Data preprocessing completed. Resized images saved in train/test directories.
# Define paths to preprocessed dataset
train_dir = os.path.join(output_dir, 'train')
test_dir = os.path.join(output_dir, 'test')
# Get processed Healthy and Parkinson images from the train set
healthy_images = [os.path.join(train_dir, '0', img) for img in os.listdir(os.path.join(train_dir, '0'))[:10]]
parkinson_images = [os.path.join(train_dir, '1', img) for img in os.listdir(os.path.join(train_dir, '1'))[:10]]
# Combine images and set titles
selected_images = healthy_images + parkinson_images
titles = ['Healthy'] * 10 + ['Parkinson'] * 10
# Display some processed images
fig, axes = plt.subplots(2, 10, figsize=(15, 5))
for idx, img_path in enumerate(selected_images):
image = cv2.imread(img_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
row = 0 if idx < 10 else 1
col = idx % 10
axes[row, col].imshow(image)
axes[row, col].set_title(titles[idx])
axes[row, col].axis('off')
plt.tight_layout()
# plt.savefig('processed_images.png', dpi=300)
plt.show()
All images have been resized to a consistent size. Well done!
Edge Detection:
Healthy: The edges in the healthy samples appear smoother and more consistent, with well-defined and continuous lines forming clear patterns such as spirals and waves.
Parkinson: The edges in the Parkinson samples show irregularities, distortions, and jaggedness. There are noticeable tremors and inconsistencies in the drawn patterns, indicating potential motor control difficulties.
Conclusion: The edge detection results suggest that there are observable structural differences between healthy and Parkinson images, which could be useful features for classification purposes.
def edge_detection(img_path):
image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
edges = cv2.Canny(image, 50, 150)
return edges
fig, axes = plt.subplots(2, 10, figsize=(15, 5))
for idx, img_path in enumerate(selected_images):
edges = edge_detection(img_path)
row = 0 if idx < 10 else 1
col = idx % 10
axes[row, col].imshow(edges, cmap='gray')
axes[row, col].set_title(titles[idx])
axes[row, col].axis('off')
plt.tight_layout()
# plt.savefig('edge_images.png', dpi=300)
plt.show()
Pixel Intensity Distribution:
Healthy: Sharp peak near 250, indicating brighter pixels; minor peak around 150-200.
Parkinson: Similar trend but with a broader intensity range, especially in 150-200.
Conclusion: Parkinson images show more pixel variation, likely due to motor impairments affecting pen pressure and consistency.
# Initialize lists to store pixel values
healthy_pixels = []
parkinson_pixels = []
# Read all images from test set
healthy_dir = os.path.join(test_dir, '0')
parkinson_dir = os.path.join(test_dir, '1')
# Process Healthy images
for img_name in os.listdir(healthy_dir):
img_path = os.path.join(healthy_dir, img_name)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
healthy_pixels.extend(img.ravel()) # Flatten and accumulate pixel values
# Process Parkinson images
for img_name in os.listdir(parkinson_dir):
img_path = os.path.join(parkinson_dir, img_name)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
parkinson_pixels.extend(img.ravel()) # Flatten and accumulate pixel values
# Plot KDEs
plt.figure(figsize=(8, 5))
# Plot Healthy pixels
sns.kdeplot(healthy_pixels, color='skyblue', fill=True, alpha=0.5, label='Healthy')
# Plot Parkinson pixels
sns.kdeplot(parkinson_pixels, color='salmon', fill=True, alpha=0.5, label='Parkinson')
plt.title('\nPixel Intensity Distribution\n')
plt.xlabel('Pixel Intensity')
plt.ylabel('Density')
plt.legend(loc='upper left', bbox_to_anchor=(0, 1))
plt.savefig('pixel_distribution.png', dpi=300)
plt.show()
2. Image Preparation (for Deep Learning):¶
Data Normalization:
- Apply pixel value scaling to the range [0,1] using
rescale=1./255to normalize image data.
- Apply pixel value scaling to the range [0,1] using
Load Training data:
- Resize images to
224x224pixels to match input requirements for pretrained models - Use a batch size of
16for efficient processing. - Set
class_mode='binary'to handle two classes (0: Healthy, 1: Parkinson).
- Resize images to
Load Testing data:
- Load images from the testing directory with the same preprocessing steps as training.
- Ensure consistent target size and batch size for evaluation purposes.
- Keep image ordering consistent by setting
shuffle=False.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Data normalization
datagen = ImageDataGenerator(rescale=1./255)
# Load training data
train_generator = datagen.flow_from_directory(
train_dir,
target_size=(224, 224), # Adjusted for pretrained models
batch_size=16,
class_mode='binary', # Binarized labels (0 and 1)
shuffle=True, # Shuffle training data
seed=SEED
)
# Load test data
test_generator = datagen.flow_from_directory(
test_dir,
target_size=(224, 224),
batch_size=16,
class_mode='binary',
shuffle=False, # Keep evaluation order consistent
seed=SEED
)
# Check class indices
print("Class indices:", train_generator.class_indices)
Found 2611 images belonging to 2 classes.
Found 653 images belonging to 2 classes.
Class indices: {'0': 0, '1': 1}
3. Feature Extraction (for Traditional Models):¶
Image Preprocessing:
- Load and resize images to
224x224to match the VGG16 input size. - Convert images to numerical arrays using
image.img_to_array(). - Using
preprocess_input()to normalize pixel values.
- Load and resize images to
Feature Extraction:
- Use the
VGG16model to extract meaningful features from the images. - Flatten the extracted features into a 1D feature vector.
- Use the
Labeling: Assign class labels (
0for Healthy,1for Parkinson).Storage: Save extracted features and labels as NumPy arrays for ML models.
from tensorflow.keras.applications import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input
# Load pre-trained VGG16 model without the top layers (only feature extractor)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
def extract_features(image_dir):
features = []
labels = []
for label in ['0', '1']: # 0: Healthy, 1: Parkinson
class_dir = os.path.join(image_dir, label)
for img_name in os.listdir(class_dir):
img_path = os.path.join(class_dir, img_name)
img = image.load_img(img_path, target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = preprocess_input(np.expand_dims(img_array, axis=0))
# Extract features from VGG16
feature = base_model.predict(img_array).flatten()
features.append(feature)
labels.append(int(label))
return np.array(features), np.array(labels)
# Extract features
X_train, y_train = extract_features(os.path.join(output_dir, 'train'))
X_test, y_test = extract_features(os.path.join(output_dir, 'test'))
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5 58889256/58889256 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 3s 3s/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 17ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
# Check the shape of the feature matrices
print("Feature shape:", X_train.shape, X_test.shape)
Feature shape: (2611, 25088) (653, 25088)
4 Models¶
Step 1: Deep Learning¶
Overview:¶
CNN (Custom): A basic custom CNN is used to build a model from scratch, providing a foundational approach to extract features from hand-drawn images and classify them. This allows full control over the architecture and serves as a baseline to compare the performance of more advanced pre-trained models.
MobileNetV2 (Transfer Learning): MobileNetV2 is a pre-trained model selected for its lightweight and efficient design. Using transfer learning, it can leverage features learned from large-scale datasets, such as ImageNet, to adapt to the Parkinson's disease dataset. This is particularly useful for scenarios with limited data, ensuring better performance with reduced training time and resources.
VGG16 (Transfer Learning): VGG16 is chosen as a pre-trained model for its deep and consistent architecture, which has been widely validated in image classification tasks. Transfer learning enables the model to utilize its pre-learned feature representations, making it effective for detecting patterns in the hand-drawn images with minimal tuning.
DenseNet121 (Transfer Learning): DenseNet121 is included for its dense connectivity, which promotes feature reuse and enhances gradient flow. As a pre-trained model, it leverages its robust feature extraction capabilities to identify subtle patterns in the dataset, making it a strong candidate for complex classification tasks.
1. CNN:¶
Input Layer: Accepts images of shape (224, 224, 3).
Convolutional-Pooling Blocks:
- Block 1:
32filters (3x3),ReLUactivation, MaxPooling (2x2). - Block 2:
64filters (3x3),ReLUactivation, MaxPooling (2x2). - Block 3:
128filters (3x3),ReLUactivation, MaxPooling (2x2).
- Block 1:
Flatten Layer: Converts 2D features to 1D.
Fully Connected Layers:
Dense(256neurons,ReLUactivation).Dropout(0.5to prevent overfitting).
Output Layer:
Dense(1neuron,sigmoidactivation) for binary classification.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
# Build the CNN model
model = Sequential([
Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)),
MaxPooling2D(2,2),
Conv2D(64, (3,3), activation='relu'),
MaxPooling2D(2,2),
Conv2D(128, (3,3), activation='relu'),
MaxPooling2D(2,2),
Flatten(),
Dense(256, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
# Compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Model summary
model.summary()
Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ conv2d_6 (Conv2D) │ (None, 222, 222, 32) │ 896 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ max_pooling2d_6 (MaxPooling2D) │ (None, 111, 111, 32) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ conv2d_7 (Conv2D) │ (None, 109, 109, 64) │ 18,496 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ max_pooling2d_7 (MaxPooling2D) │ (None, 54, 54, 64) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ conv2d_8 (Conv2D) │ (None, 52, 52, 128) │ 73,856 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ max_pooling2d_8 (MaxPooling2D) │ (None, 26, 26, 128) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten_2 (Flatten) │ (None, 86528) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_12 (Dense) │ (None, 256) │ 22,151,424 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout_6 (Dropout) │ (None, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_13 (Dense) │ (None, 1) │ 257 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 22,244,929 (84.86 MB)
Trainable params: 22,244,929 (84.86 MB)
Non-trainable params: 0 (0.00 B)
import time
from tensorflow.keras.callbacks import EarlyStopping
# Early stopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# Start timer
start_time = time.time()
# Train the model
history = model.fit(
train_generator,
epochs=20,
validation_data=test_generator,
callbacks=[early_stopping]
)
# End timer
end_time = time.time()
# Calculate training duration
training_time = end_time - start_time
minutes, seconds = divmod(training_time, 60)
print("-" * 120)
print(f"Training completed in {int(minutes)} minutes and {int(seconds)} seconds.")
# Plot accuracy and loss graphs
plt.figure(figsize=(12, 3))
# Plot Accuracy
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Test Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('\nTraining vs Test Accuracy\n')
# Plot Loss
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Test Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title('\nTraining vs Test Loss\n')
plt.show()
Epoch 1/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 16s 72ms/step - accuracy: 0.5166 - loss: 0.7416 - val_accuracy: 0.5161 - val_loss: 0.6864 Epoch 2/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.5812 - loss: 0.6790 - val_accuracy: 0.7213 - val_loss: 0.5922 Epoch 3/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.7269 - loss: 0.5341 - val_accuracy: 0.7580 - val_loss: 0.5210 Epoch 4/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.8357 - loss: 0.3792 - val_accuracy: 0.8331 - val_loss: 0.3755 Epoch 5/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9192 - loss: 0.2152 - val_accuracy: 0.8882 - val_loss: 0.3278 Epoch 6/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9537 - loss: 0.1449 - val_accuracy: 0.9234 - val_loss: 0.2875 Epoch 7/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9767 - loss: 0.0700 - val_accuracy: 0.9372 - val_loss: 0.3206 Epoch 8/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9800 - loss: 0.0655 - val_accuracy: 0.9433 - val_loss: 0.2483 Epoch 9/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 58ms/step - accuracy: 0.9758 - loss: 0.0816 - val_accuracy: 0.9525 - val_loss: 0.2692 Epoch 10/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9930 - loss: 0.0279 - val_accuracy: 0.9571 - val_loss: 0.2627 Epoch 11/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 62ms/step - accuracy: 0.9869 - loss: 0.0416 - val_accuracy: 0.9571 - val_loss: 0.2408 Epoch 12/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9935 - loss: 0.0177 - val_accuracy: 0.9632 - val_loss: 0.2225 Epoch 13/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 58ms/step - accuracy: 0.9957 - loss: 0.0229 - val_accuracy: 0.9587 - val_loss: 0.3222 Epoch 14/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9962 - loss: 0.0129 - val_accuracy: 0.9587 - val_loss: 0.2767 Epoch 15/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9954 - loss: 0.0118 - val_accuracy: 0.9556 - val_loss: 0.3930 Epoch 16/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9951 - loss: 0.0270 - val_accuracy: 0.9602 - val_loss: 0.3254 Epoch 17/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9969 - loss: 0.0116 - val_accuracy: 0.9632 - val_loss: 0.3894 ------------------------------------------------------------------------------------------------------------------------ Training completed in 2 minutes and 59 seconds.
from sklearn.metrics import confusion_matrix, roc_auc_score, accuracy_score, f1_score
# Predict the test set
y_pred_prob = model.predict(test_generator)
y_pred = (y_pred_prob > 0.5).astype(int)
# Get true labels
y_true = test_generator.classes
# Confusion Matrix
conf_matrix = confusion_matrix(y_true, y_pred)
plt.figure(figsize=(4, 3))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',
xticklabels=['Healthy', 'Parkinson'],
yticklabels=['Healthy', 'Parkinson'],
cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('\nTest Data\n')
plt.show()
# Evaluation Metrics
accuracy = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
auc = roc_auc_score(y_true, y_pred_prob)
print(f'Accuracy: {accuracy:.2f}')
print(f'F1 Score: {f1:.2f}')
print(f'AUC Score: {auc:.2f}')
41/41 ━━━━━━━━━━━━━━━━━━━━ 2s 50ms/step
Accuracy: 0.96 F1 Score: 0.96 AUC Score: 0.98
2. MobileNetV2:¶
Base Model:
- Uses
MobileNetV2pre-trained on ImageNet as the feature extractor. - The top classification layers are excluded (
include_top=False). - All layers are frozen to retain pre-trained weights (
base_model.trainable = False).
- Uses
Custom Classification Head:
GlobalAveragePooling2D: Reduces feature maps to a single value.Dense(256neurons,ReLUactivation).Dropout(0.5to prevent overfitting).Dense(1neuron,sigmoidactivation) for binary classification.
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.layers import GlobalAveragePooling2D
from tensorflow.keras.models import Model
# Load MobileNetV2 as the base model (excluding the top classification layers)
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Freeze all layers of the pre-trained model
base_model.trainable = False
# Add new classification layers on top of MobileNetV2
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(1, activation='sigmoid')(x)
# Build the complete model
mobilenet_model = Model(inputs=base_model.input, outputs=output)
# Compile the model
mobilenet_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Model summary
mobilenet_model.summary()
Model: "functional_5"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ Connected to ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ │ input_layer_6 │ (None, 224, 224, 3) │ 0 │ - │ │ (InputLayer) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ Conv1 (Conv2D) │ (None, 112, 112, 32) │ 864 │ input_layer_6[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ bn_Conv1 │ (None, 112, 112, 32) │ 128 │ Conv1[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ Conv1_relu (ReLU) │ (None, 112, 112, 32) │ 0 │ bn_Conv1[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ expanded_conv_depthwise │ (None, 112, 112, 32) │ 288 │ Conv1_relu[0][0] │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ expanded_conv_depthwise_… │ (None, 112, 112, 32) │ 128 │ expanded_conv_depthwi… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ expanded_conv_depthwise_… │ (None, 112, 112, 32) │ 0 │ expanded_conv_depthwi… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ expanded_conv_project │ (None, 112, 112, 16) │ 512 │ expanded_conv_depthwi… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ expanded_conv_project_BN │ (None, 112, 112, 16) │ 64 │ expanded_conv_project… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_expand (Conv2D) │ (None, 112, 112, 96) │ 1,536 │ expanded_conv_project… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_expand_BN │ (None, 112, 112, 96) │ 384 │ block_1_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_expand_relu │ (None, 112, 112, 96) │ 0 │ block_1_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_pad │ (None, 113, 113, 96) │ 0 │ block_1_expand_relu[0… │ │ (ZeroPadding2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_depthwise │ (None, 56, 56, 96) │ 864 │ block_1_pad[0][0] │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_depthwise_BN │ (None, 56, 56, 96) │ 384 │ block_1_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_depthwise_relu │ (None, 56, 56, 96) │ 0 │ block_1_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_project (Conv2D) │ (None, 56, 56, 24) │ 2,304 │ block_1_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_1_project_BN │ (None, 56, 56, 24) │ 96 │ block_1_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_expand (Conv2D) │ (None, 56, 56, 144) │ 3,456 │ block_1_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_expand_BN │ (None, 56, 56, 144) │ 576 │ block_2_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_expand_relu │ (None, 56, 56, 144) │ 0 │ block_2_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_depthwise │ (None, 56, 56, 144) │ 1,296 │ block_2_expand_relu[0… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_depthwise_BN │ (None, 56, 56, 144) │ 576 │ block_2_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_depthwise_relu │ (None, 56, 56, 144) │ 0 │ block_2_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_project (Conv2D) │ (None, 56, 56, 24) │ 3,456 │ block_2_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_project_BN │ (None, 56, 56, 24) │ 96 │ block_2_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_2_add (Add) │ (None, 56, 56, 24) │ 0 │ block_1_project_BN[0]… │ │ │ │ │ block_2_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_expand (Conv2D) │ (None, 56, 56, 144) │ 3,456 │ block_2_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_expand_BN │ (None, 56, 56, 144) │ 576 │ block_3_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_expand_relu │ (None, 56, 56, 144) │ 0 │ block_3_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_pad │ (None, 57, 57, 144) │ 0 │ block_3_expand_relu[0… │ │ (ZeroPadding2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_depthwise │ (None, 28, 28, 144) │ 1,296 │ block_3_pad[0][0] │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_depthwise_BN │ (None, 28, 28, 144) │ 576 │ block_3_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_depthwise_relu │ (None, 28, 28, 144) │ 0 │ block_3_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_project (Conv2D) │ (None, 28, 28, 32) │ 4,608 │ block_3_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_3_project_BN │ (None, 28, 28, 32) │ 128 │ block_3_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_expand (Conv2D) │ (None, 28, 28, 192) │ 6,144 │ block_3_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_expand_BN │ (None, 28, 28, 192) │ 768 │ block_4_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_expand_relu │ (None, 28, 28, 192) │ 0 │ block_4_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_depthwise │ (None, 28, 28, 192) │ 1,728 │ block_4_expand_relu[0… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_depthwise_BN │ (None, 28, 28, 192) │ 768 │ block_4_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_depthwise_relu │ (None, 28, 28, 192) │ 0 │ block_4_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_project (Conv2D) │ (None, 28, 28, 32) │ 6,144 │ block_4_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_project_BN │ (None, 28, 28, 32) │ 128 │ block_4_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_4_add (Add) │ (None, 28, 28, 32) │ 0 │ block_3_project_BN[0]… │ │ │ │ │ block_4_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_expand (Conv2D) │ (None, 28, 28, 192) │ 6,144 │ block_4_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_expand_BN │ (None, 28, 28, 192) │ 768 │ block_5_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_expand_relu │ (None, 28, 28, 192) │ 0 │ block_5_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_depthwise │ (None, 28, 28, 192) │ 1,728 │ block_5_expand_relu[0… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_depthwise_BN │ (None, 28, 28, 192) │ 768 │ block_5_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_depthwise_relu │ (None, 28, 28, 192) │ 0 │ block_5_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_project (Conv2D) │ (None, 28, 28, 32) │ 6,144 │ block_5_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_project_BN │ (None, 28, 28, 32) │ 128 │ block_5_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_5_add (Add) │ (None, 28, 28, 32) │ 0 │ block_4_add[0][0], │ │ │ │ │ block_5_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_expand (Conv2D) │ (None, 28, 28, 192) │ 6,144 │ block_5_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_expand_BN │ (None, 28, 28, 192) │ 768 │ block_6_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_expand_relu │ (None, 28, 28, 192) │ 0 │ block_6_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_pad │ (None, 29, 29, 192) │ 0 │ block_6_expand_relu[0… │ │ (ZeroPadding2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_depthwise │ (None, 14, 14, 192) │ 1,728 │ block_6_pad[0][0] │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_depthwise_BN │ (None, 14, 14, 192) │ 768 │ block_6_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_depthwise_relu │ (None, 14, 14, 192) │ 0 │ block_6_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_project (Conv2D) │ (None, 14, 14, 64) │ 12,288 │ block_6_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_6_project_BN │ (None, 14, 14, 64) │ 256 │ block_6_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_expand (Conv2D) │ (None, 14, 14, 384) │ 24,576 │ block_6_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_expand_BN │ (None, 14, 14, 384) │ 1,536 │ block_7_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_expand_relu │ (None, 14, 14, 384) │ 0 │ block_7_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_depthwise │ (None, 14, 14, 384) │ 3,456 │ block_7_expand_relu[0… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_depthwise_BN │ (None, 14, 14, 384) │ 1,536 │ block_7_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_depthwise_relu │ (None, 14, 14, 384) │ 0 │ block_7_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_project (Conv2D) │ (None, 14, 14, 64) │ 24,576 │ block_7_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_project_BN │ (None, 14, 14, 64) │ 256 │ block_7_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_7_add (Add) │ (None, 14, 14, 64) │ 0 │ block_6_project_BN[0]… │ │ │ │ │ block_7_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_expand (Conv2D) │ (None, 14, 14, 384) │ 24,576 │ block_7_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_expand_BN │ (None, 14, 14, 384) │ 1,536 │ block_8_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_expand_relu │ (None, 14, 14, 384) │ 0 │ block_8_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_depthwise │ (None, 14, 14, 384) │ 3,456 │ block_8_expand_relu[0… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_depthwise_BN │ (None, 14, 14, 384) │ 1,536 │ block_8_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_depthwise_relu │ (None, 14, 14, 384) │ 0 │ block_8_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_project (Conv2D) │ (None, 14, 14, 64) │ 24,576 │ block_8_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_project_BN │ (None, 14, 14, 64) │ 256 │ block_8_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_8_add (Add) │ (None, 14, 14, 64) │ 0 │ block_7_add[0][0], │ │ │ │ │ block_8_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_expand (Conv2D) │ (None, 14, 14, 384) │ 24,576 │ block_8_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_expand_BN │ (None, 14, 14, 384) │ 1,536 │ block_9_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_expand_relu │ (None, 14, 14, 384) │ 0 │ block_9_expand_BN[0][… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_depthwise │ (None, 14, 14, 384) │ 3,456 │ block_9_expand_relu[0… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_depthwise_BN │ (None, 14, 14, 384) │ 1,536 │ block_9_depthwise[0][… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_depthwise_relu │ (None, 14, 14, 384) │ 0 │ block_9_depthwise_BN[… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_project (Conv2D) │ (None, 14, 14, 64) │ 24,576 │ block_9_depthwise_rel… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_project_BN │ (None, 14, 14, 64) │ 256 │ block_9_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_9_add (Add) │ (None, 14, 14, 64) │ 0 │ block_8_add[0][0], │ │ │ │ │ block_9_project_BN[0]… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_expand (Conv2D) │ (None, 14, 14, 384) │ 24,576 │ block_9_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_expand_BN │ (None, 14, 14, 384) │ 1,536 │ block_10_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_expand_relu │ (None, 14, 14, 384) │ 0 │ block_10_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_depthwise │ (None, 14, 14, 384) │ 3,456 │ block_10_expand_relu[… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_depthwise_BN │ (None, 14, 14, 384) │ 1,536 │ block_10_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_depthwise_relu │ (None, 14, 14, 384) │ 0 │ block_10_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_project (Conv2D) │ (None, 14, 14, 96) │ 36,864 │ block_10_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_10_project_BN │ (None, 14, 14, 96) │ 384 │ block_10_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_expand (Conv2D) │ (None, 14, 14, 576) │ 55,296 │ block_10_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_expand_BN │ (None, 14, 14, 576) │ 2,304 │ block_11_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_expand_relu │ (None, 14, 14, 576) │ 0 │ block_11_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_depthwise │ (None, 14, 14, 576) │ 5,184 │ block_11_expand_relu[… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_depthwise_BN │ (None, 14, 14, 576) │ 2,304 │ block_11_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_depthwise_relu │ (None, 14, 14, 576) │ 0 │ block_11_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_project (Conv2D) │ (None, 14, 14, 96) │ 55,296 │ block_11_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_project_BN │ (None, 14, 14, 96) │ 384 │ block_11_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_11_add (Add) │ (None, 14, 14, 96) │ 0 │ block_10_project_BN[0… │ │ │ │ │ block_11_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_expand (Conv2D) │ (None, 14, 14, 576) │ 55,296 │ block_11_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_expand_BN │ (None, 14, 14, 576) │ 2,304 │ block_12_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_expand_relu │ (None, 14, 14, 576) │ 0 │ block_12_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_depthwise │ (None, 14, 14, 576) │ 5,184 │ block_12_expand_relu[… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_depthwise_BN │ (None, 14, 14, 576) │ 2,304 │ block_12_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_depthwise_relu │ (None, 14, 14, 576) │ 0 │ block_12_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_project (Conv2D) │ (None, 14, 14, 96) │ 55,296 │ block_12_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_project_BN │ (None, 14, 14, 96) │ 384 │ block_12_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_12_add (Add) │ (None, 14, 14, 96) │ 0 │ block_11_add[0][0], │ │ │ │ │ block_12_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_expand (Conv2D) │ (None, 14, 14, 576) │ 55,296 │ block_12_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_expand_BN │ (None, 14, 14, 576) │ 2,304 │ block_13_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_expand_relu │ (None, 14, 14, 576) │ 0 │ block_13_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_pad │ (None, 15, 15, 576) │ 0 │ block_13_expand_relu[… │ │ (ZeroPadding2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_depthwise │ (None, 7, 7, 576) │ 5,184 │ block_13_pad[0][0] │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_depthwise_BN │ (None, 7, 7, 576) │ 2,304 │ block_13_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_depthwise_relu │ (None, 7, 7, 576) │ 0 │ block_13_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_project (Conv2D) │ (None, 7, 7, 160) │ 92,160 │ block_13_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_13_project_BN │ (None, 7, 7, 160) │ 640 │ block_13_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_expand (Conv2D) │ (None, 7, 7, 960) │ 153,600 │ block_13_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_expand_BN │ (None, 7, 7, 960) │ 3,840 │ block_14_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_expand_relu │ (None, 7, 7, 960) │ 0 │ block_14_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_depthwise │ (None, 7, 7, 960) │ 8,640 │ block_14_expand_relu[… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_depthwise_BN │ (None, 7, 7, 960) │ 3,840 │ block_14_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_depthwise_relu │ (None, 7, 7, 960) │ 0 │ block_14_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_project (Conv2D) │ (None, 7, 7, 160) │ 153,600 │ block_14_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_project_BN │ (None, 7, 7, 160) │ 640 │ block_14_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_14_add (Add) │ (None, 7, 7, 160) │ 0 │ block_13_project_BN[0… │ │ │ │ │ block_14_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_expand (Conv2D) │ (None, 7, 7, 960) │ 153,600 │ block_14_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_expand_BN │ (None, 7, 7, 960) │ 3,840 │ block_15_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_expand_relu │ (None, 7, 7, 960) │ 0 │ block_15_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_depthwise │ (None, 7, 7, 960) │ 8,640 │ block_15_expand_relu[… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_depthwise_BN │ (None, 7, 7, 960) │ 3,840 │ block_15_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_depthwise_relu │ (None, 7, 7, 960) │ 0 │ block_15_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_project (Conv2D) │ (None, 7, 7, 160) │ 153,600 │ block_15_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_project_BN │ (None, 7, 7, 160) │ 640 │ block_15_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_15_add (Add) │ (None, 7, 7, 160) │ 0 │ block_14_add[0][0], │ │ │ │ │ block_15_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_expand (Conv2D) │ (None, 7, 7, 960) │ 153,600 │ block_15_add[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_expand_BN │ (None, 7, 7, 960) │ 3,840 │ block_16_expand[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_expand_relu │ (None, 7, 7, 960) │ 0 │ block_16_expand_BN[0]… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_depthwise │ (None, 7, 7, 960) │ 8,640 │ block_16_expand_relu[… │ │ (DepthwiseConv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_depthwise_BN │ (None, 7, 7, 960) │ 3,840 │ block_16_depthwise[0]… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_depthwise_relu │ (None, 7, 7, 960) │ 0 │ block_16_depthwise_BN… │ │ (ReLU) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_project (Conv2D) │ (None, 7, 7, 320) │ 307,200 │ block_16_depthwise_re… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ block_16_project_BN │ (None, 7, 7, 320) │ 1,280 │ block_16_project[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ Conv_1 (Conv2D) │ (None, 7, 7, 1280) │ 409,600 │ block_16_project_BN[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ Conv_1_bn │ (None, 7, 7, 1280) │ 5,120 │ Conv_1[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ out_relu (ReLU) │ (None, 7, 7, 1280) │ 0 │ Conv_1_bn[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ global_average_pooling2d… │ (None, 1280) │ 0 │ out_relu[0][0] │ │ (GlobalAveragePooling2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ dense_10 (Dense) │ (None, 256) │ 327,936 │ global_average_poolin… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ dropout_5 (Dropout) │ (None, 256) │ 0 │ dense_10[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ dense_11 (Dense) │ (None, 1) │ 257 │ dropout_5[0][0] │ └───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
Total params: 2,586,177 (9.87 MB)
Trainable params: 328,193 (1.25 MB)
Non-trainable params: 2,257,984 (8.61 MB)
# Early stopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# Start timer
start_time = time.time()
# Train the model
history = mobilenet_model.fit(
train_generator,
epochs=20,
validation_data=test_generator,
callbacks=[early_stopping]
)
# End timer
end_time = time.time()
# Calculate training duration
training_time = end_time - start_time
minutes, seconds = divmod(training_time, 60)
print("-" * 120)
print(f"Training completed in {int(minutes)} minutes and {int(seconds)} seconds.")
# Plot accuracy and loss graphs
plt.figure(figsize=(12, 3))
# Plot Accuracy
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Test Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('\nTraining vs Test Accuracy\n')
# Plot Loss
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Test Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title('\nTraining vs Test Loss\n')
plt.show()
Epoch 1/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 23s 97ms/step - accuracy: 0.7379 - loss: 0.5367 - val_accuracy: 0.8606 - val_loss: 0.3143 Epoch 2/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 62ms/step - accuracy: 0.8490 - loss: 0.3196 - val_accuracy: 0.8913 - val_loss: 0.2602 Epoch 3/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.8870 - loss: 0.2423 - val_accuracy: 0.9234 - val_loss: 0.1957 Epoch 4/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9064 - loss: 0.2116 - val_accuracy: 0.9219 - val_loss: 0.1774 Epoch 5/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 62ms/step - accuracy: 0.9165 - loss: 0.1871 - val_accuracy: 0.9357 - val_loss: 0.1549 Epoch 6/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 63ms/step - accuracy: 0.9307 - loss: 0.1614 - val_accuracy: 0.9433 - val_loss: 0.1417 Epoch 7/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9406 - loss: 0.1377 - val_accuracy: 0.9495 - val_loss: 0.1241 Epoch 8/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9639 - loss: 0.1048 - val_accuracy: 0.9449 - val_loss: 0.1339 Epoch 9/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9584 - loss: 0.0988 - val_accuracy: 0.9556 - val_loss: 0.1162 Epoch 10/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 58ms/step - accuracy: 0.9595 - loss: 0.1004 - val_accuracy: 0.9525 - val_loss: 0.1112 Epoch 11/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9598 - loss: 0.1135 - val_accuracy: 0.9587 - val_loss: 0.0993 Epoch 12/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9651 - loss: 0.0950 - val_accuracy: 0.9541 - val_loss: 0.1053 Epoch 13/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9774 - loss: 0.0699 - val_accuracy: 0.9587 - val_loss: 0.0882 Epoch 14/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9657 - loss: 0.0882 - val_accuracy: 0.9724 - val_loss: 0.0775 Epoch 15/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9793 - loss: 0.0539 - val_accuracy: 0.9571 - val_loss: 0.0977 Epoch 16/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 60ms/step - accuracy: 0.9829 - loss: 0.0504 - val_accuracy: 0.9724 - val_loss: 0.0695 Epoch 17/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9851 - loss: 0.0478 - val_accuracy: 0.9694 - val_loss: 0.0909 Epoch 18/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 61ms/step - accuracy: 0.9788 - loss: 0.0633 - val_accuracy: 0.9587 - val_loss: 0.0915 Epoch 19/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9926 - loss: 0.0300 - val_accuracy: 0.9724 - val_loss: 0.0747 Epoch 20/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 10s 59ms/step - accuracy: 0.9849 - loss: 0.0444 - val_accuracy: 0.9709 - val_loss: 0.0805 ------------------------------------------------------------------------------------------------------------------------ Training completed in 3 minutes and 39 seconds.
# Predict the test set
y_pred_prob = mobilenet_model.predict(test_generator)
y_pred = (y_pred_prob > 0.5).astype(int)
# Get true labels
y_true = test_generator.classes
# Confusion Matrix
conf_matrix = confusion_matrix(y_true, y_pred)
plt.figure(figsize=(4, 3))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',
xticklabels=['Healthy', 'Parkinson'],
yticklabels=['Healthy', 'Parkinson'],
cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('\nTest Data\n')
plt.show()
# Evaluation Metrics
accuracy = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
auc = roc_auc_score(y_true, y_pred_prob)
print(f'Accuracy: {accuracy:.2f}')
print(f'F1 Score: {f1:.2f}')
print(f'AUC Score: {auc:.2f}')
41/41 ━━━━━━━━━━━━━━━━━━━━ 2s 50ms/step
Accuracy: 0.97 F1 Score: 0.97 AUC Score: 1.00
3. VGG16:¶
The architecture shares common elements with
MobileNetV2, including GlobalAveragePooling2D, Dropout (0.5), and a Dense (Sigmoid) output layer for binary classification.Key Difference: The fully connected layer uses 512 neurons (vs. 256 in
MobileNetV2) to accommodate VGG16's high-dimensional feature maps (e.g., 7x7x512), ensuring it captures the complex features effectively.
from tensorflow.keras.applications import VGG16
# Load VGG16 as the base model (excluding the top classification layers)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Freeze all layers of the VGG16 pre-trained model
base_model.trainable = False
# Create custom classification layers
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(512, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(1, activation='sigmoid')(x)
# Build the complete model
vgg_model = Model(inputs=base_model.input, outputs=output)
# Compile the model
vgg_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Model summary
vgg_model.summary()
Model: "functional_7"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ input_layer_8 (InputLayer) │ (None, 224, 224, 3) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv1 (Conv2D) │ (None, 224, 224, 64) │ 1,792 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv2 (Conv2D) │ (None, 224, 224, 64) │ 36,928 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_pool (MaxPooling2D) │ (None, 112, 112, 64) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv1 (Conv2D) │ (None, 112, 112, 128) │ 73,856 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv2 (Conv2D) │ (None, 112, 112, 128) │ 147,584 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_pool (MaxPooling2D) │ (None, 56, 56, 128) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv1 (Conv2D) │ (None, 56, 56, 256) │ 295,168 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv2 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv3 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_pool (MaxPooling2D) │ (None, 28, 28, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_conv1 (Conv2D) │ (None, 28, 28, 512) │ 1,180,160 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_conv2 (Conv2D) │ (None, 28, 28, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_conv3 (Conv2D) │ (None, 28, 28, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_pool (MaxPooling2D) │ (None, 14, 14, 512) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_conv1 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_conv2 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_conv3 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_pool (MaxPooling2D) │ (None, 7, 7, 512) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ global_average_pooling2d_4 │ (None, 512) │ 0 │ │ (GlobalAveragePooling2D) │ │ │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_14 (Dense) │ (None, 512) │ 262,656 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout_7 (Dropout) │ (None, 512) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_15 (Dense) │ (None, 1) │ 513 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 14,977,857 (57.14 MB)
Trainable params: 263,169 (1.00 MB)
Non-trainable params: 14,714,688 (56.13 MB)
# Early stopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# Start timer
start_time = time.time()
# Train the model
history = vgg_model.fit(
train_generator,
epochs=20,
validation_data=test_generator,
callbacks=[early_stopping]
)
# End timer
end_time = time.time()
# Calculate training duration
training_time = end_time - start_time
minutes, seconds = divmod(training_time, 60)
print("-" * 120)
print(f"Training completed in {int(minutes)} minutes and {int(seconds)} seconds.")
# Plot accuracy and loss graphs
plt.figure(figsize=(12, 3))
# Plot Accuracy
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Test Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('\nTraining vs Test Accuracy\n')
# Plot Loss
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Test Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title('\nTraining vs Test Loss\n')
plt.show()
Epoch 1/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 19s 98ms/step - accuracy: 0.6762 - loss: 0.5997 - val_accuracy: 0.8484 - val_loss: 0.3751 Epoch 2/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 15s 88ms/step - accuracy: 0.8029 - loss: 0.4254 - val_accuracy: 0.8315 - val_loss: 0.3775 Epoch 3/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 85ms/step - accuracy: 0.8215 - loss: 0.3965 - val_accuracy: 0.8560 - val_loss: 0.3371 Epoch 4/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 83ms/step - accuracy: 0.8357 - loss: 0.3695 - val_accuracy: 0.8729 - val_loss: 0.3030 Epoch 5/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 82ms/step - accuracy: 0.8602 - loss: 0.3338 - val_accuracy: 0.8744 - val_loss: 0.2837 Epoch 6/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 83ms/step - accuracy: 0.8609 - loss: 0.3176 - val_accuracy: 0.8821 - val_loss: 0.2862 Epoch 7/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8528 - loss: 0.3287 - val_accuracy: 0.8836 - val_loss: 0.2617 Epoch 8/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8630 - loss: 0.2953 - val_accuracy: 0.8760 - val_loss: 0.2625 Epoch 9/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8689 - loss: 0.2969 - val_accuracy: 0.8897 - val_loss: 0.2639 Epoch 10/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8608 - loss: 0.2952 - val_accuracy: 0.8882 - val_loss: 0.2493 Epoch 11/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 83ms/step - accuracy: 0.8801 - loss: 0.2619 - val_accuracy: 0.8821 - val_loss: 0.2519 Epoch 12/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 83ms/step - accuracy: 0.8816 - loss: 0.2725 - val_accuracy: 0.9035 - val_loss: 0.2201 Epoch 13/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 83ms/step - accuracy: 0.8755 - loss: 0.2927 - val_accuracy: 0.9035 - val_loss: 0.2105 Epoch 14/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8989 - loss: 0.2320 - val_accuracy: 0.9066 - val_loss: 0.2091 Epoch 15/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 83ms/step - accuracy: 0.9115 - loss: 0.2089 - val_accuracy: 0.9142 - val_loss: 0.2127 Epoch 16/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8984 - loss: 0.2246 - val_accuracy: 0.9096 - val_loss: 0.2018 Epoch 17/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.8998 - loss: 0.2349 - val_accuracy: 0.9204 - val_loss: 0.1927 Epoch 18/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.9136 - loss: 0.2059 - val_accuracy: 0.9158 - val_loss: 0.1886 Epoch 19/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.9150 - loss: 0.1989 - val_accuracy: 0.9188 - val_loss: 0.1911 Epoch 20/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 14s 84ms/step - accuracy: 0.9191 - loss: 0.1971 - val_accuracy: 0.9173 - val_loss: 0.1949 ------------------------------------------------------------------------------------------------------------------------ Training completed in 4 minutes and 47 seconds.
# Predict the test set
y_pred_prob = vgg_model.predict(test_generator)
y_pred = (y_pred_prob > 0.5).astype(int)
# Get true labels
y_true = test_generator.classes
# Confusion Matrix
conf_matrix = confusion_matrix(y_true, y_pred)
plt.figure(figsize=(4, 3))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',
xticklabels=['Healthy', 'Parkinson'],
yticklabels=['Healthy', 'Parkinson'],
cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('\nTest Data\n')
plt.show()
# Evaluation Metrics
accuracy = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
auc = roc_auc_score(y_true, y_pred_prob)
print(f'Accuracy: {accuracy:.2f}')
print(f'F1 Score: {f1:.2f}')
print(f'AUC Score: {auc:.2f}')
41/41 ━━━━━━━━━━━━━━━━━━━━ 3s 73ms/step
Accuracy: 0.92 F1 Score: 0.91 AUC Score: 0.98
4. DenseNet121:¶
The architecture shares common elements with
MobileNetV2andVGG16, including GlobalAveragePooling2D, Dropout (0.5), and a Dense (Sigmoid) output layer for binary classification.Key Difference:
DenseNet121’s densely connected layers promote feature reuse and efficient gradient flow, producing richer and more compact feature maps compared toVGG16’s independent layer design. The 512-neuron Dense layer ensures these complex outputs are effectively utilized without bottlenecking.
from tensorflow.keras.applications import DenseNet121
# Load DenseNet121 as the base model (excluding the top classification layers)
base_model = DenseNet121(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Freeze all layers of the DenseNet121 pre-trained model
base_model.trainable = False
# Create custom classification layers
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(512, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(1, activation='sigmoid')(x)
# Build the complete model
densenet_model = Model(inputs=base_model.input, outputs=output)
# Compile the model
densenet_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Model summary
densenet_model.summary()
Model: "functional_8"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ Connected to ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ │ input_layer_9 │ (None, 224, 224, 3) │ 0 │ - │ │ (InputLayer) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ zero_padding2d_2 │ (None, 230, 230, 3) │ 0 │ input_layer_9[0][0] │ │ (ZeroPadding2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv1_conv (Conv2D) │ (None, 112, 112, 64) │ 9,408 │ zero_padding2d_2[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv1_bn │ (None, 112, 112, 64) │ 256 │ conv1_conv[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv1_relu (Activation) │ (None, 112, 112, 64) │ 0 │ conv1_bn[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ zero_padding2d_3 │ (None, 114, 114, 64) │ 0 │ conv1_relu[0][0] │ │ (ZeroPadding2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool1 (MaxPooling2D) │ (None, 56, 56, 64) │ 0 │ zero_padding2d_3[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_0_bn │ (None, 56, 56, 64) │ 256 │ pool1[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_0_relu │ (None, 56, 56, 64) │ 0 │ conv2_block1_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_1_conv │ (None, 56, 56, 128) │ 8,192 │ conv2_block1_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_1_bn │ (None, 56, 56, 128) │ 512 │ conv2_block1_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_1_relu │ (None, 56, 56, 128) │ 0 │ conv2_block1_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_2_conv │ (None, 56, 56, 32) │ 36,864 │ conv2_block1_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block1_concat │ (None, 56, 56, 96) │ 0 │ pool1[0][0], │ │ (Concatenate) │ │ │ conv2_block1_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_0_bn │ (None, 56, 56, 96) │ 384 │ conv2_block1_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_0_relu │ (None, 56, 56, 96) │ 0 │ conv2_block2_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_1_conv │ (None, 56, 56, 128) │ 12,288 │ conv2_block2_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_1_bn │ (None, 56, 56, 128) │ 512 │ conv2_block2_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_1_relu │ (None, 56, 56, 128) │ 0 │ conv2_block2_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_2_conv │ (None, 56, 56, 32) │ 36,864 │ conv2_block2_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block2_concat │ (None, 56, 56, 128) │ 0 │ conv2_block1_concat[0… │ │ (Concatenate) │ │ │ conv2_block2_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_0_bn │ (None, 56, 56, 128) │ 512 │ conv2_block2_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_0_relu │ (None, 56, 56, 128) │ 0 │ conv2_block3_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_1_conv │ (None, 56, 56, 128) │ 16,384 │ conv2_block3_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_1_bn │ (None, 56, 56, 128) │ 512 │ conv2_block3_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_1_relu │ (None, 56, 56, 128) │ 0 │ conv2_block3_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_2_conv │ (None, 56, 56, 32) │ 36,864 │ conv2_block3_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block3_concat │ (None, 56, 56, 160) │ 0 │ conv2_block2_concat[0… │ │ (Concatenate) │ │ │ conv2_block3_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_0_bn │ (None, 56, 56, 160) │ 640 │ conv2_block3_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_0_relu │ (None, 56, 56, 160) │ 0 │ conv2_block4_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_1_conv │ (None, 56, 56, 128) │ 20,480 │ conv2_block4_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_1_bn │ (None, 56, 56, 128) │ 512 │ conv2_block4_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_1_relu │ (None, 56, 56, 128) │ 0 │ conv2_block4_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_2_conv │ (None, 56, 56, 32) │ 36,864 │ conv2_block4_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block4_concat │ (None, 56, 56, 192) │ 0 │ conv2_block3_concat[0… │ │ (Concatenate) │ │ │ conv2_block4_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_0_bn │ (None, 56, 56, 192) │ 768 │ conv2_block4_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_0_relu │ (None, 56, 56, 192) │ 0 │ conv2_block5_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_1_conv │ (None, 56, 56, 128) │ 24,576 │ conv2_block5_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_1_bn │ (None, 56, 56, 128) │ 512 │ conv2_block5_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_1_relu │ (None, 56, 56, 128) │ 0 │ conv2_block5_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_2_conv │ (None, 56, 56, 32) │ 36,864 │ conv2_block5_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block5_concat │ (None, 56, 56, 224) │ 0 │ conv2_block4_concat[0… │ │ (Concatenate) │ │ │ conv2_block5_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_0_bn │ (None, 56, 56, 224) │ 896 │ conv2_block5_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_0_relu │ (None, 56, 56, 224) │ 0 │ conv2_block6_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_1_conv │ (None, 56, 56, 128) │ 28,672 │ conv2_block6_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_1_bn │ (None, 56, 56, 128) │ 512 │ conv2_block6_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_1_relu │ (None, 56, 56, 128) │ 0 │ conv2_block6_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_2_conv │ (None, 56, 56, 32) │ 36,864 │ conv2_block6_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv2_block6_concat │ (None, 56, 56, 256) │ 0 │ conv2_block5_concat[0… │ │ (Concatenate) │ │ │ conv2_block6_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool2_bn │ (None, 56, 56, 256) │ 1,024 │ conv2_block6_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool2_relu (Activation) │ (None, 56, 56, 256) │ 0 │ pool2_bn[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool2_conv (Conv2D) │ (None, 56, 56, 128) │ 32,768 │ pool2_relu[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool2_pool │ (None, 28, 28, 128) │ 0 │ pool2_conv[0][0] │ │ (AveragePooling2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_0_bn │ (None, 28, 28, 128) │ 512 │ pool2_pool[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_0_relu │ (None, 28, 28, 128) │ 0 │ conv3_block1_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_1_conv │ (None, 28, 28, 128) │ 16,384 │ conv3_block1_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block1_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block1_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block1_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block1_concat │ (None, 28, 28, 160) │ 0 │ pool2_pool[0][0], │ │ (Concatenate) │ │ │ conv3_block1_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_0_bn │ (None, 28, 28, 160) │ 640 │ conv3_block1_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_0_relu │ (None, 28, 28, 160) │ 0 │ conv3_block2_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_1_conv │ (None, 28, 28, 128) │ 20,480 │ conv3_block2_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block2_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block2_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block2_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block2_concat │ (None, 28, 28, 192) │ 0 │ conv3_block1_concat[0… │ │ (Concatenate) │ │ │ conv3_block2_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_0_bn │ (None, 28, 28, 192) │ 768 │ conv3_block2_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_0_relu │ (None, 28, 28, 192) │ 0 │ conv3_block3_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_1_conv │ (None, 28, 28, 128) │ 24,576 │ conv3_block3_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block3_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block3_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block3_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block3_concat │ (None, 28, 28, 224) │ 0 │ conv3_block2_concat[0… │ │ (Concatenate) │ │ │ conv3_block3_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_0_bn │ (None, 28, 28, 224) │ 896 │ conv3_block3_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_0_relu │ (None, 28, 28, 224) │ 0 │ conv3_block4_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_1_conv │ (None, 28, 28, 128) │ 28,672 │ conv3_block4_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block4_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block4_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block4_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block4_concat │ (None, 28, 28, 256) │ 0 │ conv3_block3_concat[0… │ │ (Concatenate) │ │ │ conv3_block4_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_0_bn │ (None, 28, 28, 256) │ 1,024 │ conv3_block4_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_0_relu │ (None, 28, 28, 256) │ 0 │ conv3_block5_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_1_conv │ (None, 28, 28, 128) │ 32,768 │ conv3_block5_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block5_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block5_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block5_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block5_concat │ (None, 28, 28, 288) │ 0 │ conv3_block4_concat[0… │ │ (Concatenate) │ │ │ conv3_block5_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_0_bn │ (None, 28, 28, 288) │ 1,152 │ conv3_block5_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_0_relu │ (None, 28, 28, 288) │ 0 │ conv3_block6_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_1_conv │ (None, 28, 28, 128) │ 36,864 │ conv3_block6_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block6_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block6_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block6_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block6_concat │ (None, 28, 28, 320) │ 0 │ conv3_block5_concat[0… │ │ (Concatenate) │ │ │ conv3_block6_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_0_bn │ (None, 28, 28, 320) │ 1,280 │ conv3_block6_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_0_relu │ (None, 28, 28, 320) │ 0 │ conv3_block7_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_1_conv │ (None, 28, 28, 128) │ 40,960 │ conv3_block7_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block7_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block7_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block7_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block7_concat │ (None, 28, 28, 352) │ 0 │ conv3_block6_concat[0… │ │ (Concatenate) │ │ │ conv3_block7_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_0_bn │ (None, 28, 28, 352) │ 1,408 │ conv3_block7_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_0_relu │ (None, 28, 28, 352) │ 0 │ conv3_block8_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_1_conv │ (None, 28, 28, 128) │ 45,056 │ conv3_block8_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block8_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block8_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block8_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block8_concat │ (None, 28, 28, 384) │ 0 │ conv3_block7_concat[0… │ │ (Concatenate) │ │ │ conv3_block8_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_0_bn │ (None, 28, 28, 384) │ 1,536 │ conv3_block8_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_0_relu │ (None, 28, 28, 384) │ 0 │ conv3_block9_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_1_conv │ (None, 28, 28, 128) │ 49,152 │ conv3_block9_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block9_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block9_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block9_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block9_concat │ (None, 28, 28, 416) │ 0 │ conv3_block8_concat[0… │ │ (Concatenate) │ │ │ conv3_block9_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_0_bn │ (None, 28, 28, 416) │ 1,664 │ conv3_block9_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_0_relu │ (None, 28, 28, 416) │ 0 │ conv3_block10_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_1_conv │ (None, 28, 28, 128) │ 53,248 │ conv3_block10_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block10_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block10_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block10_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block10_concat │ (None, 28, 28, 448) │ 0 │ conv3_block9_concat[0… │ │ (Concatenate) │ │ │ conv3_block10_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_0_bn │ (None, 28, 28, 448) │ 1,792 │ conv3_block10_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_0_relu │ (None, 28, 28, 448) │ 0 │ conv3_block11_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_1_conv │ (None, 28, 28, 128) │ 57,344 │ conv3_block11_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block11_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block11_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block11_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block11_concat │ (None, 28, 28, 480) │ 0 │ conv3_block10_concat[… │ │ (Concatenate) │ │ │ conv3_block11_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_0_bn │ (None, 28, 28, 480) │ 1,920 │ conv3_block11_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_0_relu │ (None, 28, 28, 480) │ 0 │ conv3_block12_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_1_conv │ (None, 28, 28, 128) │ 61,440 │ conv3_block12_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_1_bn │ (None, 28, 28, 128) │ 512 │ conv3_block12_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_1_relu │ (None, 28, 28, 128) │ 0 │ conv3_block12_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_2_conv │ (None, 28, 28, 32) │ 36,864 │ conv3_block12_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv3_block12_concat │ (None, 28, 28, 512) │ 0 │ conv3_block11_concat[… │ │ (Concatenate) │ │ │ conv3_block12_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool3_bn │ (None, 28, 28, 512) │ 2,048 │ conv3_block12_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool3_relu (Activation) │ (None, 28, 28, 512) │ 0 │ pool3_bn[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool3_conv (Conv2D) │ (None, 28, 28, 256) │ 131,072 │ pool3_relu[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool3_pool │ (None, 14, 14, 256) │ 0 │ pool3_conv[0][0] │ │ (AveragePooling2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_0_bn │ (None, 14, 14, 256) │ 1,024 │ pool3_pool[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_0_relu │ (None, 14, 14, 256) │ 0 │ conv4_block1_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_1_conv │ (None, 14, 14, 128) │ 32,768 │ conv4_block1_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block1_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block1_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block1_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block1_concat │ (None, 14, 14, 288) │ 0 │ pool3_pool[0][0], │ │ (Concatenate) │ │ │ conv4_block1_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_0_bn │ (None, 14, 14, 288) │ 1,152 │ conv4_block1_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_0_relu │ (None, 14, 14, 288) │ 0 │ conv4_block2_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_1_conv │ (None, 14, 14, 128) │ 36,864 │ conv4_block2_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block2_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block2_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block2_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block2_concat │ (None, 14, 14, 320) │ 0 │ conv4_block1_concat[0… │ │ (Concatenate) │ │ │ conv4_block2_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_0_bn │ (None, 14, 14, 320) │ 1,280 │ conv4_block2_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_0_relu │ (None, 14, 14, 320) │ 0 │ conv4_block3_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_1_conv │ (None, 14, 14, 128) │ 40,960 │ conv4_block3_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block3_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block3_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block3_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block3_concat │ (None, 14, 14, 352) │ 0 │ conv4_block2_concat[0… │ │ (Concatenate) │ │ │ conv4_block3_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_0_bn │ (None, 14, 14, 352) │ 1,408 │ conv4_block3_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_0_relu │ (None, 14, 14, 352) │ 0 │ conv4_block4_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_1_conv │ (None, 14, 14, 128) │ 45,056 │ conv4_block4_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block4_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block4_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block4_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block4_concat │ (None, 14, 14, 384) │ 0 │ conv4_block3_concat[0… │ │ (Concatenate) │ │ │ conv4_block4_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_0_bn │ (None, 14, 14, 384) │ 1,536 │ conv4_block4_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_0_relu │ (None, 14, 14, 384) │ 0 │ conv4_block5_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_1_conv │ (None, 14, 14, 128) │ 49,152 │ conv4_block5_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block5_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block5_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block5_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block5_concat │ (None, 14, 14, 416) │ 0 │ conv4_block4_concat[0… │ │ (Concatenate) │ │ │ conv4_block5_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_0_bn │ (None, 14, 14, 416) │ 1,664 │ conv4_block5_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_0_relu │ (None, 14, 14, 416) │ 0 │ conv4_block6_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_1_conv │ (None, 14, 14, 128) │ 53,248 │ conv4_block6_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block6_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block6_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block6_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block6_concat │ (None, 14, 14, 448) │ 0 │ conv4_block5_concat[0… │ │ (Concatenate) │ │ │ conv4_block6_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_0_bn │ (None, 14, 14, 448) │ 1,792 │ conv4_block6_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_0_relu │ (None, 14, 14, 448) │ 0 │ conv4_block7_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_1_conv │ (None, 14, 14, 128) │ 57,344 │ conv4_block7_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block7_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block7_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block7_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block7_concat │ (None, 14, 14, 480) │ 0 │ conv4_block6_concat[0… │ │ (Concatenate) │ │ │ conv4_block7_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_0_bn │ (None, 14, 14, 480) │ 1,920 │ conv4_block7_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_0_relu │ (None, 14, 14, 480) │ 0 │ conv4_block8_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_1_conv │ (None, 14, 14, 128) │ 61,440 │ conv4_block8_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block8_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block8_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block8_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block8_concat │ (None, 14, 14, 512) │ 0 │ conv4_block7_concat[0… │ │ (Concatenate) │ │ │ conv4_block8_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_0_bn │ (None, 14, 14, 512) │ 2,048 │ conv4_block8_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_0_relu │ (None, 14, 14, 512) │ 0 │ conv4_block9_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_1_conv │ (None, 14, 14, 128) │ 65,536 │ conv4_block9_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block9_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block9_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block9_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block9_concat │ (None, 14, 14, 544) │ 0 │ conv4_block8_concat[0… │ │ (Concatenate) │ │ │ conv4_block9_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_0_bn │ (None, 14, 14, 544) │ 2,176 │ conv4_block9_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_0_relu │ (None, 14, 14, 544) │ 0 │ conv4_block10_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_1_conv │ (None, 14, 14, 128) │ 69,632 │ conv4_block10_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block10_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block10_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block10_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block10_concat │ (None, 14, 14, 576) │ 0 │ conv4_block9_concat[0… │ │ (Concatenate) │ │ │ conv4_block10_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_0_bn │ (None, 14, 14, 576) │ 2,304 │ conv4_block10_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_0_relu │ (None, 14, 14, 576) │ 0 │ conv4_block11_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_1_conv │ (None, 14, 14, 128) │ 73,728 │ conv4_block11_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block11_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block11_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block11_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block11_concat │ (None, 14, 14, 608) │ 0 │ conv4_block10_concat[… │ │ (Concatenate) │ │ │ conv4_block11_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_0_bn │ (None, 14, 14, 608) │ 2,432 │ conv4_block11_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_0_relu │ (None, 14, 14, 608) │ 0 │ conv4_block12_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_1_conv │ (None, 14, 14, 128) │ 77,824 │ conv4_block12_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block12_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block12_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block12_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block12_concat │ (None, 14, 14, 640) │ 0 │ conv4_block11_concat[… │ │ (Concatenate) │ │ │ conv4_block12_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_0_bn │ (None, 14, 14, 640) │ 2,560 │ conv4_block12_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_0_relu │ (None, 14, 14, 640) │ 0 │ conv4_block13_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_1_conv │ (None, 14, 14, 128) │ 81,920 │ conv4_block13_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block13_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block13_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block13_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block13_concat │ (None, 14, 14, 672) │ 0 │ conv4_block12_concat[… │ │ (Concatenate) │ │ │ conv4_block13_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_0_bn │ (None, 14, 14, 672) │ 2,688 │ conv4_block13_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_0_relu │ (None, 14, 14, 672) │ 0 │ conv4_block14_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_1_conv │ (None, 14, 14, 128) │ 86,016 │ conv4_block14_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block14_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block14_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block14_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block14_concat │ (None, 14, 14, 704) │ 0 │ conv4_block13_concat[… │ │ (Concatenate) │ │ │ conv4_block14_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_0_bn │ (None, 14, 14, 704) │ 2,816 │ conv4_block14_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_0_relu │ (None, 14, 14, 704) │ 0 │ conv4_block15_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_1_conv │ (None, 14, 14, 128) │ 90,112 │ conv4_block15_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block15_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block15_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block15_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block15_concat │ (None, 14, 14, 736) │ 0 │ conv4_block14_concat[… │ │ (Concatenate) │ │ │ conv4_block15_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_0_bn │ (None, 14, 14, 736) │ 2,944 │ conv4_block15_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_0_relu │ (None, 14, 14, 736) │ 0 │ conv4_block16_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_1_conv │ (None, 14, 14, 128) │ 94,208 │ conv4_block16_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block16_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block16_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block16_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block16_concat │ (None, 14, 14, 768) │ 0 │ conv4_block15_concat[… │ │ (Concatenate) │ │ │ conv4_block16_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_0_bn │ (None, 14, 14, 768) │ 3,072 │ conv4_block16_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_0_relu │ (None, 14, 14, 768) │ 0 │ conv4_block17_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_1_conv │ (None, 14, 14, 128) │ 98,304 │ conv4_block17_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block17_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block17_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block17_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block17_concat │ (None, 14, 14, 800) │ 0 │ conv4_block16_concat[… │ │ (Concatenate) │ │ │ conv4_block17_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_0_bn │ (None, 14, 14, 800) │ 3,200 │ conv4_block17_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_0_relu │ (None, 14, 14, 800) │ 0 │ conv4_block18_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_1_conv │ (None, 14, 14, 128) │ 102,400 │ conv4_block18_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block18_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block18_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block18_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block18_concat │ (None, 14, 14, 832) │ 0 │ conv4_block17_concat[… │ │ (Concatenate) │ │ │ conv4_block18_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_0_bn │ (None, 14, 14, 832) │ 3,328 │ conv4_block18_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_0_relu │ (None, 14, 14, 832) │ 0 │ conv4_block19_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_1_conv │ (None, 14, 14, 128) │ 106,496 │ conv4_block19_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block19_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block19_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block19_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block19_concat │ (None, 14, 14, 864) │ 0 │ conv4_block18_concat[… │ │ (Concatenate) │ │ │ conv4_block19_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_0_bn │ (None, 14, 14, 864) │ 3,456 │ conv4_block19_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_0_relu │ (None, 14, 14, 864) │ 0 │ conv4_block20_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_1_conv │ (None, 14, 14, 128) │ 110,592 │ conv4_block20_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block20_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block20_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block20_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block20_concat │ (None, 14, 14, 896) │ 0 │ conv4_block19_concat[… │ │ (Concatenate) │ │ │ conv4_block20_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_0_bn │ (None, 14, 14, 896) │ 3,584 │ conv4_block20_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_0_relu │ (None, 14, 14, 896) │ 0 │ conv4_block21_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_1_conv │ (None, 14, 14, 128) │ 114,688 │ conv4_block21_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block21_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block21_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block21_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block21_concat │ (None, 14, 14, 928) │ 0 │ conv4_block20_concat[… │ │ (Concatenate) │ │ │ conv4_block21_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_0_bn │ (None, 14, 14, 928) │ 3,712 │ conv4_block21_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_0_relu │ (None, 14, 14, 928) │ 0 │ conv4_block22_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_1_conv │ (None, 14, 14, 128) │ 118,784 │ conv4_block22_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block22_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block22_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block22_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block22_concat │ (None, 14, 14, 960) │ 0 │ conv4_block21_concat[… │ │ (Concatenate) │ │ │ conv4_block22_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_0_bn │ (None, 14, 14, 960) │ 3,840 │ conv4_block22_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_0_relu │ (None, 14, 14, 960) │ 0 │ conv4_block23_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_1_conv │ (None, 14, 14, 128) │ 122,880 │ conv4_block23_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block23_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block23_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block23_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block23_concat │ (None, 14, 14, 992) │ 0 │ conv4_block22_concat[… │ │ (Concatenate) │ │ │ conv4_block23_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_0_bn │ (None, 14, 14, 992) │ 3,968 │ conv4_block23_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_0_relu │ (None, 14, 14, 992) │ 0 │ conv4_block24_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_1_conv │ (None, 14, 14, 128) │ 126,976 │ conv4_block24_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_1_bn │ (None, 14, 14, 128) │ 512 │ conv4_block24_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_1_relu │ (None, 14, 14, 128) │ 0 │ conv4_block24_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_2_conv │ (None, 14, 14, 32) │ 36,864 │ conv4_block24_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv4_block24_concat │ (None, 14, 14, 1024) │ 0 │ conv4_block23_concat[… │ │ (Concatenate) │ │ │ conv4_block24_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool4_bn │ (None, 14, 14, 1024) │ 4,096 │ conv4_block24_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool4_relu (Activation) │ (None, 14, 14, 1024) │ 0 │ pool4_bn[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool4_conv (Conv2D) │ (None, 14, 14, 512) │ 524,288 │ pool4_relu[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ pool4_pool │ (None, 7, 7, 512) │ 0 │ pool4_conv[0][0] │ │ (AveragePooling2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_0_bn │ (None, 7, 7, 512) │ 2,048 │ pool4_pool[0][0] │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_0_relu │ (None, 7, 7, 512) │ 0 │ conv5_block1_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_1_conv │ (None, 7, 7, 128) │ 65,536 │ conv5_block1_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block1_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block1_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block1_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block1_concat │ (None, 7, 7, 544) │ 0 │ pool4_pool[0][0], │ │ (Concatenate) │ │ │ conv5_block1_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_0_bn │ (None, 7, 7, 544) │ 2,176 │ conv5_block1_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_0_relu │ (None, 7, 7, 544) │ 0 │ conv5_block2_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_1_conv │ (None, 7, 7, 128) │ 69,632 │ conv5_block2_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block2_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block2_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block2_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block2_concat │ (None, 7, 7, 576) │ 0 │ conv5_block1_concat[0… │ │ (Concatenate) │ │ │ conv5_block2_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_0_bn │ (None, 7, 7, 576) │ 2,304 │ conv5_block2_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_0_relu │ (None, 7, 7, 576) │ 0 │ conv5_block3_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_1_conv │ (None, 7, 7, 128) │ 73,728 │ conv5_block3_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block3_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block3_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block3_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block3_concat │ (None, 7, 7, 608) │ 0 │ conv5_block2_concat[0… │ │ (Concatenate) │ │ │ conv5_block3_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_0_bn │ (None, 7, 7, 608) │ 2,432 │ conv5_block3_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_0_relu │ (None, 7, 7, 608) │ 0 │ conv5_block4_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_1_conv │ (None, 7, 7, 128) │ 77,824 │ conv5_block4_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block4_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block4_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block4_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block4_concat │ (None, 7, 7, 640) │ 0 │ conv5_block3_concat[0… │ │ (Concatenate) │ │ │ conv5_block4_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_0_bn │ (None, 7, 7, 640) │ 2,560 │ conv5_block4_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_0_relu │ (None, 7, 7, 640) │ 0 │ conv5_block5_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_1_conv │ (None, 7, 7, 128) │ 81,920 │ conv5_block5_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block5_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block5_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block5_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block5_concat │ (None, 7, 7, 672) │ 0 │ conv5_block4_concat[0… │ │ (Concatenate) │ │ │ conv5_block5_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_0_bn │ (None, 7, 7, 672) │ 2,688 │ conv5_block5_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_0_relu │ (None, 7, 7, 672) │ 0 │ conv5_block6_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_1_conv │ (None, 7, 7, 128) │ 86,016 │ conv5_block6_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block6_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block6_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block6_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block6_concat │ (None, 7, 7, 704) │ 0 │ conv5_block5_concat[0… │ │ (Concatenate) │ │ │ conv5_block6_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_0_bn │ (None, 7, 7, 704) │ 2,816 │ conv5_block6_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_0_relu │ (None, 7, 7, 704) │ 0 │ conv5_block7_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_1_conv │ (None, 7, 7, 128) │ 90,112 │ conv5_block7_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block7_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block7_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block7_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block7_concat │ (None, 7, 7, 736) │ 0 │ conv5_block6_concat[0… │ │ (Concatenate) │ │ │ conv5_block7_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_0_bn │ (None, 7, 7, 736) │ 2,944 │ conv5_block7_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_0_relu │ (None, 7, 7, 736) │ 0 │ conv5_block8_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_1_conv │ (None, 7, 7, 128) │ 94,208 │ conv5_block8_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block8_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block8_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block8_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block8_concat │ (None, 7, 7, 768) │ 0 │ conv5_block7_concat[0… │ │ (Concatenate) │ │ │ conv5_block8_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_0_bn │ (None, 7, 7, 768) │ 3,072 │ conv5_block8_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_0_relu │ (None, 7, 7, 768) │ 0 │ conv5_block9_0_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_1_conv │ (None, 7, 7, 128) │ 98,304 │ conv5_block9_0_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block9_1_conv[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block9_1_bn[0][… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block9_1_relu[0… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block9_concat │ (None, 7, 7, 800) │ 0 │ conv5_block8_concat[0… │ │ (Concatenate) │ │ │ conv5_block9_2_conv[0… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_0_bn │ (None, 7, 7, 800) │ 3,200 │ conv5_block9_concat[0… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_0_relu │ (None, 7, 7, 800) │ 0 │ conv5_block10_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_1_conv │ (None, 7, 7, 128) │ 102,400 │ conv5_block10_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block10_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block10_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block10_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block10_concat │ (None, 7, 7, 832) │ 0 │ conv5_block9_concat[0… │ │ (Concatenate) │ │ │ conv5_block10_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_0_bn │ (None, 7, 7, 832) │ 3,328 │ conv5_block10_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_0_relu │ (None, 7, 7, 832) │ 0 │ conv5_block11_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_1_conv │ (None, 7, 7, 128) │ 106,496 │ conv5_block11_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block11_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block11_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block11_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block11_concat │ (None, 7, 7, 864) │ 0 │ conv5_block10_concat[… │ │ (Concatenate) │ │ │ conv5_block11_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_0_bn │ (None, 7, 7, 864) │ 3,456 │ conv5_block11_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_0_relu │ (None, 7, 7, 864) │ 0 │ conv5_block12_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_1_conv │ (None, 7, 7, 128) │ 110,592 │ conv5_block12_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block12_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block12_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block12_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block12_concat │ (None, 7, 7, 896) │ 0 │ conv5_block11_concat[… │ │ (Concatenate) │ │ │ conv5_block12_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_0_bn │ (None, 7, 7, 896) │ 3,584 │ conv5_block12_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_0_relu │ (None, 7, 7, 896) │ 0 │ conv5_block13_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_1_conv │ (None, 7, 7, 128) │ 114,688 │ conv5_block13_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block13_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block13_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block13_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block13_concat │ (None, 7, 7, 928) │ 0 │ conv5_block12_concat[… │ │ (Concatenate) │ │ │ conv5_block13_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_0_bn │ (None, 7, 7, 928) │ 3,712 │ conv5_block13_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_0_relu │ (None, 7, 7, 928) │ 0 │ conv5_block14_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_1_conv │ (None, 7, 7, 128) │ 118,784 │ conv5_block14_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block14_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block14_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block14_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block14_concat │ (None, 7, 7, 960) │ 0 │ conv5_block13_concat[… │ │ (Concatenate) │ │ │ conv5_block14_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_0_bn │ (None, 7, 7, 960) │ 3,840 │ conv5_block14_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_0_relu │ (None, 7, 7, 960) │ 0 │ conv5_block15_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_1_conv │ (None, 7, 7, 128) │ 122,880 │ conv5_block15_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block15_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block15_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block15_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block15_concat │ (None, 7, 7, 992) │ 0 │ conv5_block14_concat[… │ │ (Concatenate) │ │ │ conv5_block15_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_0_bn │ (None, 7, 7, 992) │ 3,968 │ conv5_block15_concat[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_0_relu │ (None, 7, 7, 992) │ 0 │ conv5_block16_0_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_1_conv │ (None, 7, 7, 128) │ 126,976 │ conv5_block16_0_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_1_bn │ (None, 7, 7, 128) │ 512 │ conv5_block16_1_conv[… │ │ (BatchNormalization) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_1_relu │ (None, 7, 7, 128) │ 0 │ conv5_block16_1_bn[0]… │ │ (Activation) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_2_conv │ (None, 7, 7, 32) │ 36,864 │ conv5_block16_1_relu[… │ │ (Conv2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ conv5_block16_concat │ (None, 7, 7, 1024) │ 0 │ conv5_block15_concat[… │ │ (Concatenate) │ │ │ conv5_block16_2_conv[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ bn (BatchNormalization) │ (None, 7, 7, 1024) │ 4,096 │ conv5_block16_concat[… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ relu (Activation) │ (None, 7, 7, 1024) │ 0 │ bn[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ global_average_pooling2d… │ (None, 1024) │ 0 │ relu[0][0] │ │ (GlobalAveragePooling2D) │ │ │ │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ dense_16 (Dense) │ (None, 512) │ 524,800 │ global_average_poolin… │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ dropout_8 (Dropout) │ (None, 512) │ 0 │ dense_16[0][0] │ ├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤ │ dense_17 (Dense) │ (None, 1) │ 513 │ dropout_8[0][0] │ └───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
Total params: 7,562,817 (28.85 MB)
Trainable params: 525,313 (2.00 MB)
Non-trainable params: 7,037,504 (26.85 MB)
# Early stopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# Start timer
start_time = time.time()
# Train the model
history = densenet_model.fit(
train_generator,
epochs=20,
validation_data=test_generator,
callbacks=[early_stopping]
)
# End timer
end_time = time.time()
# Calculate training duration
training_time = end_time - start_time
minutes, seconds = divmod(training_time, 60)
print("-" * 120)
print(f"Training completed in {int(minutes)} minutes and {int(seconds)} seconds.")
# Plot accuracy and loss graphs
plt.figure(figsize=(12, 3))
# Plot Accuracy
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Test Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('\nTraining vs Test Accuracy\n')
# Plot Loss
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Test Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title('\nTraining vs Test Loss\n')
plt.show()
Epoch 1/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 46s 165ms/step - accuracy: 0.7200 - loss: 0.5725 - val_accuracy: 0.8530 - val_loss: 0.3185 Epoch 2/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.8330 - loss: 0.3597 - val_accuracy: 0.8959 - val_loss: 0.2791 Epoch 3/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 65ms/step - accuracy: 0.8529 - loss: 0.3314 - val_accuracy: 0.8790 - val_loss: 0.2656 Epoch 4/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 12s 68ms/step - accuracy: 0.8747 - loss: 0.2981 - val_accuracy: 0.8239 - val_loss: 0.3500 Epoch 5/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.8802 - loss: 0.2800 - val_accuracy: 0.9096 - val_loss: 0.2137 Epoch 6/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 12s 68ms/step - accuracy: 0.8874 - loss: 0.2529 - val_accuracy: 0.9219 - val_loss: 0.1939 Epoch 7/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 67ms/step - accuracy: 0.9138 - loss: 0.2070 - val_accuracy: 0.9081 - val_loss: 0.2228 Epoch 8/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.9064 - loss: 0.2193 - val_accuracy: 0.9326 - val_loss: 0.1715 Epoch 9/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.9262 - loss: 0.1762 - val_accuracy: 0.9372 - val_loss: 0.1665 Epoch 10/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 12s 69ms/step - accuracy: 0.9205 - loss: 0.1869 - val_accuracy: 0.9326 - val_loss: 0.1491 Epoch 11/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 68ms/step - accuracy: 0.9273 - loss: 0.1787 - val_accuracy: 0.9433 - val_loss: 0.1388 Epoch 12/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 67ms/step - accuracy: 0.9388 - loss: 0.1529 - val_accuracy: 0.9495 - val_loss: 0.1383 Epoch 13/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.9455 - loss: 0.1378 - val_accuracy: 0.9372 - val_loss: 0.1607 Epoch 14/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 67ms/step - accuracy: 0.9418 - loss: 0.1455 - val_accuracy: 0.9510 - val_loss: 0.1249 Epoch 15/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 67ms/step - accuracy: 0.9429 - loss: 0.1541 - val_accuracy: 0.9510 - val_loss: 0.1188 Epoch 16/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 67ms/step - accuracy: 0.9511 - loss: 0.1229 - val_accuracy: 0.9632 - val_loss: 0.1085 Epoch 17/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.9599 - loss: 0.1091 - val_accuracy: 0.9617 - val_loss: 0.0980 Epoch 18/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.9600 - loss: 0.1032 - val_accuracy: 0.9188 - val_loss: 0.1712 Epoch 19/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 11s 66ms/step - accuracy: 0.9445 - loss: 0.1299 - val_accuracy: 0.9587 - val_loss: 0.0994 Epoch 20/20 164/164 ━━━━━━━━━━━━━━━━━━━━ 12s 69ms/step - accuracy: 0.9637 - loss: 0.1067 - val_accuracy: 0.9694 - val_loss: 0.0869 ------------------------------------------------------------------------------------------------------------------------ Training completed in 4 minutes and 22 seconds.
# Predict the test set
y_pred_prob = densenet_model.predict(test_generator)
y_pred = (y_pred_prob > 0.5).astype(int)
# Get true labels
y_true = test_generator.classes
# Confusion Matrix
conf_matrix = confusion_matrix(y_true, y_pred)
plt.figure(figsize=(4, 3))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',
xticklabels=['Healthy', 'Parkinson'],
yticklabels=['Healthy', 'Parkinson'],
cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('\nTest Data\n')
plt.show()
# Evaluation Metrics
accuracy = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
auc = roc_auc_score(y_true, y_pred_prob)
print(f'Accuracy: {accuracy:.2f}')
print(f'F1 Score: {f1:.2f}')
print(f'AUC Score: {auc:.2f}')
41/41 ━━━━━━━━━━━━━━━━━━━━ 16s 222ms/step
Accuracy: 0.97 F1 Score: 0.97 AUC Score: 1.00
Step 2: Traditional Models¶
Support Vector Machine: Uses the RBF kernel (
gamma='scale') withC=1.0to find the optimal hyperplane for separating classes, effective for non-linear decision boundaries.K-Nearest Neighbor: Classifies samples based on the majority class of their 5 nearest neighbors (
n_neighbors=5), using distance metrics for similarity.Random Forest: An ensemble method with 100 decision trees (
n_estimators=100) to improve classification accuracy and reduce overfitting through randomness.
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
# Define the models dictionary
models = {
"SVM": SVC(kernel='rbf', C=1.0, gamma='scale'),
"KNN": KNeighborsClassifier(n_neighbors=5),
"Random Forest": RandomForestClassifier(n_estimators=100, random_state=42)
}
# Loop through each model, train and evaluate
for name, model in models.items():
print("-" * 25)
print(f"Model: {name}")
# Train the model
model.fit(X_train, y_train)
# Predict on the test set
y_pred = model.predict(X_test)
# Evaluate accuracy
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# Compute confusion matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"Confusion Matrix:")
print(conf_matrix)
------------------------- Model: SVM Accuracy: 0.92 Confusion Matrix: [[317 10] [ 41 285]] ------------------------- Model: KNN Accuracy: 0.86 Confusion Matrix: [[321 6] [ 84 242]] ------------------------- Model: Random Forest Accuracy: 0.88 Confusion Matrix: [[313 14] [ 65 261]]
5 Results and Analysis¶
1. Performance Comparison:¶
Best Performing Model: MobileNetV2:
- MobileNetV2 had the best overall performance (0.97) with a balanced confusion matrix, showing high sensitivity and specificity.
- DenseNet121 also performed exceptionally well (0.97), with slightly more misclassified samples compared to MobileNetV2.
Performance Overview:
- CNN performed well (0.96), slightly behind MobileNetV2 and DenseNet121.
- VGG16 had lower accuracy (0.92) due to more misclassified Parkinson cases.
- Traditional models (SVM, KNN, RF) performed significantly worse, with KNN having the lowest accuracy (0.86), suggesting that deep learning models are better suited for this task.
Conclusion: Deep learning models, especially MobileNetV2 and DenseNet121, significantly outperformed traditional ML models, demonstrating their effectiveness in Parkinson’s disease detection using hand-drawn images.
| Model | Accuracy | F1-Score | AUC Score | Confusion Matrix |
|---|---|---|---|---|
| CNN | 0.96 | 0.96 | 0.98 | [318 09] [15 311] |
| MobileNet | 0.97 | 0.97 | 1.00 | [317 10] [08 318] |
| VGG | 0.92 | 0.91 | 0.98 | [323 04] [51 275] |
| DenseNet | 0.97 | 0.97 | 1.00 | [325 02] [18 308] |
| SVM | 0.92 | 0.92 | 0.92 | [317 10] [41 285] |
| KNN | 0.86 | 0.84 | 0.86 | [321 06] [84 242] |
| RF | 0.88 | 0.87 | 0.88 | [313 14] [65 261] |
# Model names
models = ["CNN", "DenseNet", "MobileNet", "SVM", "VGG", "RF", "KNN"]
# Calculate error rates
total_samples = 653
error_samples = {"CNN": 24, "MobileNet": 18, "VGG": 55, "DenseNet": 20, "SVM": 51, "KNN": 90, "RF": 79}
error_rate = [round((error_samples[model] / total_samples) * 100, 2) for model in models]
# Sort models by error rates in ascending order
sorted_indices = np.argsort(error_rate)
models = [models[i] for i in sorted_indices]
error_rate = [error_rate[i] for i in sorted_indices]
# Plot bar chart
plt.figure(figsize=(7, 3))
plt.bar(models, error_rate, color='lightsalmon', edgecolor='black', width=0.4)
plt.title("\nError Rate of Models\n", fontsize=12)
plt.ylim(0, max(error_rate) + 5) # Set y-axis range
plt.yticks(ticks=range(0, int(max(error_rate)) + 10, 5), labels=[f"{tick}%" for tick in range(0, int(max(error_rate)) + 10, 5)])
# Display values on each bar
for i, error in enumerate(error_rate):
plt.text(i, error + 0.5, f"{error}%", ha='center', fontsize=10)
plt.grid(axis='y', linestyle='--', alpha=0.5)
# plt.savefig('error_rate.png', dpi=300)
plt.show()
2. Error Analysis:¶
Misclassified Images (using
MobileNetV2as a sample):Based on the classification results, there are 18 misclassified samples:
- (True: 0, Pred: 1) - False Positives (FP): 10 samples (5 spirals, 5 waves)
- (True: 1, Pred: 0) - False Negatives (FN): 8 samples (6 spirals, 2 waves)
This suggests that spirals tend to be more challenging for the model to classify correctly.
Possible Reasons for Misclassification:
False Positives (FP):
- Natural variations in handwriting styles: Some healthy individuals may naturally have slower or less steady hand movements, creating drawings that resemble those of PD patients.
- Noise in the dataset: Differences in image quality, pen pressure, lighting conditions, or stroke thickness could lead to misinterpretations by the model.
- Aging effects: Elderly individuals without Parkinson’s may exhibit slight motor impairments, causing their drawings to resemble those of PD patients.
False Negatives (FN):
- Early-stage PD symptoms: Patients in early stages of Parkinson’s may still retain relatively steady hand control, making their drawings appear normal.
- Compensatory effort: Patients might actively try to draw more slowly and carefully, reducing tremor effects and making their drawings appear more like those of healthy individuals.
- Symptom variability: Motor symptoms fluctuate, meaning that some PD patients may have better motor control on the day of testing, leading to less distinguishable patterns.
# Identify misclassified samples
misclassified_indices = [i for i, (true, pred) in enumerate(zip(y_test, y_pred)) if true != pred]
print(f"Number of misclassified samples: {len(misclassified_indices)}")
# Separate them into two categories
misclassified_0_as_1 = [idx for idx in misclassified_indices if y_test[idx] == 0 and y_pred[idx] == 1]
misclassified_1_as_0 = [idx for idx in misclassified_indices if y_test[idx] == 1 and y_pred[idx] == 0]
# Print the results
print(f"Misclassified samples (True: 0, Pred: 1): {len(misclassified_0_as_1)}, Indices: {misclassified_0_as_1}")
print(f"Misclassified samples (True: 1, Pred: 0): {len(misclassified_1_as_0)}, Indices: {misclassified_1_as_0}")
Number of misclassified samples: 18 Misclassified samples (True: 0, Pred: 1): 10, Indices: [0, 32, 60, 83, 89, 194, 219, 247, 265, 282] Misclassified samples (True: 1, Pred: 0): 8, Indices: [404, 522, 525, 559, 585, 598, 603, 605]
# Visualize misclassified images
def visualize_images_grid(misclassified_0_as_1, misclassified_1_as_0, test_images):
num_cols_0_as_1 = 10 # Number of images in the first row
num_cols_1_as_0 = 8 # Number of images in the second row
plt.figure(figsize=(20, 8)) # Adjust figure size
# Plot the first row: True: 0, Pred: 1 (False Positive)
for i, idx in enumerate(misclassified_0_as_1):
img_path = test_images[idx]
img = Image.open(img_path)
plt.subplot(2, num_cols_0_as_1, i + 1)
plt.imshow(img)
plt.axis('off')
plt.title(f"Idx: {idx} (FP)", fontsize=10)
# Plot the second row: True: 1, Pred: 0 (False Negative)
for i, idx in enumerate(misclassified_1_as_0):
img_path = test_images[idx]
img = Image.open(img_path)
plt.subplot(2, num_cols_0_as_1, num_cols_0_as_1 + i + 1)
plt.imshow(img)
plt.axis('off')
plt.title(f"Idx: {idx} (FN)", fontsize=10)
plt.tight_layout()
plt.suptitle("\nMisclassified Images\n", fontsize=16)
# plt.savefig('misclassified_images.png', dpi=300)
plt.show()
visualize_images_grid(misclassified_0_as_1, misclassified_1_as_0, test_images)
6 Discussion and Conclusion¶
Discussion¶
1. Model Strengths and Weaknesses:¶
Deep Learning:
Strengths:
- Automatically learns hierarchical features from data.
- Achieves high accuracy in complex image-based tasks.
- Highly scalable, making it suitable for large-scale applications.
Weaknesses:
- High computational cost and memory usage, often requiring GPUs.
- Requires large datasets for optimal performance.
- Longer training times compared to traditional models.
MobileNetV2achieves the lowest error rate (2.76%) with the smallest model size (9.87MB), making it ideal for lightweight applications.VGG16, despite its strong feature extraction capabilities, has the highest error rate (8.42%), suggesting inefficiencies in this task.CNNandDenseNet121balance accuracy and resource usage but require more memory than MobileNetV2.
| Model | Total Parameters | Model Size (MB) | Training Time | Error Rate (%) |
|---|---|---|---|---|
| CNN | 22,244,929 | 84.86 | 2m 59s | 3.68 |
| MobileNet | 2,586,177 | 9.87 | 3m 39s | 2.76 |
| VGG | 14,977,857 | 57.14 | 4m 47s | 8.42 |
| DenseNet | 7,562,817 | 28.85 | 4m 22s | 3.06 |
Traditional Models:
Strengths:
- Perform well on smaller datasets without the need for extensive computational resources.
- Easier to train and tune compared to deep learning models.
- Provide interpretable decision-making processes in certain cases.
Weaknesses:
- Struggle to capture complex patterns in high-dimensional data.
- Less robust to variations compared to deep learning models.
- Require manual feature extraction, which can be time-consuming
Traditional machine learning models, such as SVM, KNN, and RF, can remain competitive in scenarios with limited resources or smaller datasets.
SVM, for example, achieves a lower error rate (7.81%) compared toVGG16(8.42%), likely because it is more effective in limited data settings and focuses on finding optimal decision boundaries. Their simplicity and lower risk of overfitting make traditional models advantageous over deep learning in such cases.
2. Limitations and Future Work:¶
Limitations:
Result Limitations:
Model Performance in Specific Scenarios: While most models performed well,
VGG16showed inferior performance compared to other CNN models, likely due to its large size and architectural inefficiencies for this task. Additionally, class imbalances or biased data distributions may still impact model performance.Training Time and Resource Demands: Deeper models like
VGG1andDenseNet121required significantly more computational resources and longer training times, making them less efficient for deployment on resource-constrained systems.
Methodological Limitations:
Model and Dataset Constraints: While data augmentation was applied, the dataset size (3,264 images) remains a constraint, potentially limiting model generalization, especially for edge cases. Collecting a larger and more diverse dataset could further enhance robustness.
Potential for Alternative Architectures: Exploring alternative architectures, such as lighter CNN variants or hybrid models, may improve efficiency and accuracy while reducing computational costs.
Future Work:
Data:
- Introduce a larger dataset, particularly focusing on underrepresented hand-drawn patterns.
- Consider incorporating multimodal data, such as handwriting dynamics or drawing speed, to improve classification performance.
Model:
- Explore more efficient models, such as lightweight deep learning architectures, to optimize performance and reduce computational demands.
- Experiment with alternative loss functions or regularization techniques to enhance classification accuracy and robustness.
- Integrate time-series analysis or use deeper network structures to better capture subtle motor impairments.
Application:
- Investigate deployment strategies for clinical environments, ensuring the model can be tested and validated under real-world conditions.
Conclusion¶
In this project, I evaluated CNN, MobileNet, VGG, and DenseNet for classifying hand-drawn patterns as indicators of PD or non-PD. MobileNet performed best with 2.76% error rate and a compact model size, making it the most efficient. To compare with deep learning, I applied SVM, KNN, and Random Forest as baselines. SVM outperformed VGG, showing that traditional models remain competitive in small-data scenarios. Overall, this study highlights the potential of deep learning in analyzing motor impairments through hand-drawn patterns and provides insights into model selection for Parkinson’s disease classification.